#ifndef _FREQUENT_ITEMSET_H
#define _FREQUENT_ITEMSET_H

// 计算所有的闭频繁项集
namespace frequent_itemset{
    #include <bits/stdc++.h>
    using namespace std;
    extern int num_obj; // 数据对象的数目
    extern int min_sup; // 最小支持度计数
    extern vector<vector<int>> data; // 数据，第一维是对象的编号，保存具体的项
    extern vector<vector<int>> M; // 闭频繁项集
    void read();

    // 暴力求解
    vector<vector<int>> foc();

    // 求所有的频繁项
    extern vector<vector<vector<int>>> L;
    extern vector<unordered_set<vector<int>>> S;
    void apriori();

    //fp-growth
    class fpTree{
        public:
        map<int,list<int>> HeadTable;
        int root, cnt;
        class Node {
            public:
            map<int,int> nxt;
            int count, fa, Item;
            Node(){nxt.clear();Item=fa=count=0;}
            void output() {
                cout <<"sup_count = "<< count <<"; ";
                for(auto &xx: nxt) cout <<"[item="<< xx.first <<",idx="<<xx.second<<"] "; 
            }
        };
        vector<Node> tr;
        vector<pair<int,int>> L;
        int createTree(vector<vector<int>> & dataset,vector<int> ct, int min_sup);
        void output();
    };
    void test_fpTree();
    void calCondBs(fpTree &F, int Item_d, vector<vector<int>> &condBs, vector<int> &ct);
    void mineTree(fpTree &F, int min_sup, vector<vector<int>> pre, vector<vector<int>> &freqItems);
    extern vector<vector<int>> freqItems;
    void fp_growth();
}


#endif